<?php
/**
 * import() 함수 관련된 페이지입니다.
 *
 * @package default 
 */


/**
 * 라이브러리의 절대경로입니다. 
 * 라이브러리가 있는 곳에 대해서 자동으로 생성됩니다.
 *
 */
define("LIB", dirname(__FILE__).DIRECTORY_SEPARATOR);    // 라이브러리 절대 경로, 필수  

$GLOBALS['INCLUDE_PATH_TABLE'] = array();
$GLOBALS['CLASS_TABLE'] = array();
$GLOBALS['LOCAL_TABLE'] = array();

/**
 * 자동 라이브러리 인클루드 
 * 
 * $GLOBALS['CLASS_TABLE'] 에 등록된 클래스가 불려지면 자동으로 인클루드 된다 .
 * 
 * @see import()
 */
function __autoload($class) {

	// 리스트가 저장이 안되어 있으면 클래스 리스트 자동 로딩 
	if (!$GLOBALS['CLASS_TABLE']) { 
		$GLOBALS['CLASS_TABLE'] = parse_ini_file(LIB.'class.ini');
	}
	
	// 로컬 라이브러리 클래스 자동 로딩 
	foreach ($GLOBALS['LOCAL_TABLE'] as $directory => $classes) { 
		if (!$classes) { 
			$GLOBALS['LOCAL_TABLE'][$directory] = parse_ini_file($directory.'class.ini');
		} 
	}

	$class = strtolower($class);

	// 라이브러리 클래스가 존재 하면 
	if (array_key_exists($class, $GLOBALS['CLASS_TABLE']) ) { 
		import($GLOBALS['CLASS_TABLE'][$class]);
	}
	
	// 개별 라이브러리 import 
	foreach ($GLOBALS['LOCAL_TABLE'] as $directory => $classes) { 
		if (array_key_exists($class, $classes)) { 
			import($GLOBALS['LOCAL_TABLE'][$directory][$class], true, $directory);
			break;
		}
	}
}

/**
 * 라이브러리 인클루드 
 *
 *  php.lang.*  처럼 패키지 안에 들어있는 모든 클래스들을 include 하는 것이 첫번째 형태이고 
 *  php.lang.String 처럼 실제 클래스 경로를 명시하는 것이 두번째 형태이다. 
 *
 * <code>
 * import("php.lang.String");
 * import("php.lang.String,php.util.ArrayUtil");
 * import("php.lang.*,php.db.*");
 * </code>
 * 
 */
function import($path, $isLocal = false, $directory = '') {

	$tempPath = explode(',', $path);

	// 클래스가 배열로 들어올 때 ..
	$tempPathSize = sizeof($tempPath); 
	if ($tempPathSize > 1) { 
		foreach ($tempPath as $_path) { 
			import($_path, $isLocal, $directory);		
		}
		return;
	}

	if (empty($path))
		return false;

	$arr = explode('.', trim($path));
	$index = sizeof($arr) - 1;
	$class = $arr[$index];  // 클래스 이름 

	if ($class == '*') {            // 클래스 이름이 * (모든것) 이면 

	    // 해당 디렉토리를 구해서 그 안의 php 파일은 모두 include한다. 
		$dir = str_replace('.', DIRECTORY_SEPARATOR, $path);  
		$dir = str_replace(DIRECTORY_SEPARATOR.'*', '', $dir);

		$temp_dir = LIB.$dir;
		
		if ($isLocal) { 
			$temp_dir = $directory.$dir;
		}

		// 디렉토리 일 경우 
		if (is_dir($temp_dir)) {

			// 디렉토리 open 
			if ($d = opendir($temp_dir)) {

				// 리스트 얻어오기 
				while (($file = readdir($d)) !== false) {

					$include_path = $temp_dir.DIRECTORY_SEPARATOR.$file;

					// 이미 include 된 것은 제외 
					if (in_array($include_path, $GLOBALS['INCLUDE_PATH_TABLE'])) { 
						continue;
					}

					// ., .., 확장자가 php가 아닌 것은 모두 제외 
					if ($file == '.' || $file == '..' || strpos($file, '.php') === FALSE) {
					    continue;
					} else {
					    include_once $include_path;
					}
				}

			   // 디렉토리 닫기 
 			   closedir($d);
			}
		 }
	}  else {	// 파일일 경우 

		$path = str_replace('.', DIRECTORY_SEPARATOR, $path);

		$include_path = LIB.$path.'.php';
		
		if ($isLocal) { 
			$include_path = $directory.$path.'.php';
		}

		if (! in_array($include_path, $GLOBALS['INCLUDE_PATH_TABLE'])) { 

			// 파일 인클루드 
			include_once $include_path;

			// include 리스트 등록
			$GLOBALS['INCLUDE_PATH_TABLE'][] = $include_path;
		}
	}
}

/**
 * 단축함수를 import 하기 위한 함수입니다. 
 * php.function. 패키지만 접근 가능합니다. 
 * 
 * @param string $package 단축함수를 사용할 패키지명 
 */
function func($package, $isLocal = false, $directory = '') { 
	$list = explode(",", $package);

	foreach ($list as $func) { 
		if ($isLocal) { 
			import(strtolower($func), $isLocal, $directory);
		} else { 
			import("php.function.".str_replace('.', '_', strtolower($func)));
		}
	}
}

/**
 * 로컬 프로젝트에서 프로젝트 내 클래스를 자동 로딩할 때 사용  
 * 
 * @param string $directory
 */
function setLocalLib($directory) { 
	if (is_dir($directory)) { 
		$directory = $directory.DIRECTORY_SEPARATOR;
	} else { 
		$directory = dirname($directory).DIRECTORY_SEPARATOR;	
	}
	
	if (!isset($GLOBALS['LOCAL_TABLE'][$directory])) { 
		$GLOBALS['LOCAL_TABLE'][$directory] = array();
	}
}

// 기본함수 로드 
func("php.lang,php.db,php.util");

// winbinder 함수 로드 
func("php.ui.winbinder");
?>